package com.wei.czz.framework.common.controller;

import com.wei.czz.common.annotation.Auth;
import com.wei.czz.common.annotation.AuthLogin;
import com.wei.czz.common.dto.common.log.LogDto;
import com.wei.czz.common.dto.common.log.LogPageEnumDto;
import com.wei.czz.common.dto.common.log.LogStatsDto;
import com.wei.czz.common.jsr303.group.Search;
import com.wei.czz.common.tool.PageDto;
import com.wei.czz.common.tool.Result;
import com.wei.czz.common.vo.common.log.LogFormVo;
import com.wei.czz.common.vo.common.log.LogStatsVo;
import com.wei.czz.framework.common.manager.LogManager;
import lombok.AllArgsConstructor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import java.util.Date;

/**
 * Created by IntelliJ IDEA.
 *
 * @author wei
 * date: 2021-05-24 15:34:30
 * className: LogController 系统日志操作请求接口类
 * version: 1.1
 * description:
 */
@RestController
@RequestMapping("/log")
@AllArgsConstructor
public class LogController {

    private static final Logger log = LoggerFactory.getLogger(LogController.class);

    private final LogManager logManager;

    /**
     * 获取日志统计数据接口
     * <p>
     * 调用方：
     *  1、浏览器-后台管理页面-限流管理页面调用
     * @param logStatsVo 日志参数对象
     * @return 日志统计数据
     */
    @PostMapping("/stats")
    @Auth(permit = "limit:config:list")
    public Result<LogStatsDto> getLogStats(@Validated @RequestBody LogStatsVo logStatsVo) {
        log.info("开始日志统计数据业务。{}", logStatsVo);

        LogStatsDto logStatsDto = logManager.getLogStats(logStatsVo);

        log.info("日志统计数据业务结束");
        return Result.success(logStatsDto);
    }

    /**
     * 分页获取请求日志接口
     * @param logFormVo 参数对象
     * @return 结果
     */
    @PostMapping("/page/list")
    @Auth(permit = "log:list")
    public Result<PageDto<LogDto>> getLogPageList(@Validated(Search.class) @RequestBody LogFormVo logFormVo) {
        log.info("开始分页获取请求日志业务。{}", logFormVo);

        PageDto<LogDto> pageDto = logManager.getLogPageList(logFormVo);

        log.info("分页获取请求日志业务结束");
        return Result.success(pageDto);
    }

    /**
     * 获取请求日志管理页面枚举接口
     * @return 结果
     */
    @GetMapping("/page/enum")
    @Auth(permit = "log:list")
    public Result<LogPageEnumDto> getPageEnum() {
        log.info("开始获取请求日志管理页面枚举业务");

        LogPageEnumDto logPageEnumDto = logManager.getPageEnum();

        log.info("获取请求日志管理页面枚举业务结束");
        return Result.success(logPageEnumDto);
    }

    /**
     * 获取接口最后一次请求成功时间接口
     * @param uri 接口路径
     * @return 结果
     */
    @GetMapping("/last-request-time/success")
    @AuthLogin
    public Result<Date> getUriLastSuccessRequestTime(@RequestParam("uri") String uri) {
        log.info("开始获取接口最后一次请求成功时间业务。uri={}", uri);

        Date date = logManager.getUriLastSuccessRequestTime(uri);

        log.info("开始获取接口最后一次请求成功时间业务结束。time={}", date);
        return Result.success(date);
    }

}
